package com.imooc.service.Impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.imooc.dao.ProductImgMapper;
import com.imooc.dao.ProductMapper;
import com.imooc.dto.ImageHolder;
import com.imooc.dto.ProductExecution;
import com.imooc.entity.Product;
import com.imooc.entity.ProductImg;
import com.imooc.enums.ProductStateEnum;
import com.imooc.service.ProductService;
import com.imooc.util.ImageUtil;
import com.imooc.util.PathUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author
 * @create 2018-08-03 17:44
 **/
@Service
public class ProductServiceImpl implements ProductService {

    @Autowired
    private ProductMapper productMapper;

    @Autowired
    private ProductImgMapper productImgMapper;

    //1 处理缩略图，获取缩略图相对路径并付给product
    //2 往tb——product写入信息，获取productId
    //3 结合productId批量处理商品详情图
    //4 将商品详情图列表批量插入tb_product_img中
    @Override
    @Transactional
    public ProductExecution addProduct(Product product, ImageHolder thumbnail, List<ImageHolder> productImgList) {
        //空值判断
        if (product != null && product.getShop() != null && product.getShop().getShopId() != null) {
            //给商品设置默认属性
            product.setCreateTime(new Date());
            product.setLastEditTime(new Date());
            //默认为上架状态
            product.setEnableStatus(1);
            //若商品缩略图不为空则添加
            if (thumbnail != null) {
                //将图片添加到该商品中
                addThumbnail(product, thumbnail);
            }
            try {
                //创建商品信息
                int effectNum = productMapper.insertProduct(product);
                if (effectNum <= 0) {
                    throw new RuntimeException("创建商品失败");
                }
            } catch (Exception e) {
                throw new RuntimeException("创建商品失败：" + e.toString());
            }
            //若商品详情图片不为空则添加
            if (productImgList != null && productImgList.size() > 0) {
                addProductImgList(product, productImgList);
            }
            return new ProductExecution(ProductStateEnum.SUCCESS, product);
        } else {
            return new ProductExecution(ProductStateEnum.EMPTY);
        }
    }

    /**
     * 通过商品Id查询唯一的商品信息
     *
     * @param productId
     * @return
     */
    @Override
    public Product getProductById(int productId) {
        return productMapper.queryProductById(productId);
    }

    /**
     * 查询商品列表，可输入的条件有：商品名(模糊)， 店铺状态、店铺Id, 店铺类别
     *
     * @param productCondition
     * @return
     */
    @Override
    public ProductExecution getProductList(Product productCondition,int pageIndex, int pageSize) {
        //dao曾查询
        //引入分页插件
        PageHelper.startPage(pageIndex, pageSize);

        List<Product> productList = productMapper.queryProductList(productCondition);
        ProductExecution productExecution = new ProductExecution();
        PageInfo<Product> productPageInfo = new PageInfo<>(productList);
        productExecution.setProductList(productList);
        productExecution.setCount(productPageInfo.getTotal());
        return productExecution;
    }

    /**
     * 修改商品信息以及图片处理
     * <p>
     * 步骤：
     * 1 若缩略图参数有值，则处理缩略图
     * 2 若原先存在的缩略图， 则先删除再添加新的缩略图，之后获取缩略图的相对路径并赋值给Product
     * 3 将tb_product_img 下面的该商品原先的商品详情图记录全部清除
     * 4 更新tb_product的信息
     *
     * @param product
     * @param thumbnail
     * @param productImgHolderList
     * @return
     */
    @Override
    @Transactional
    public ProductExecution modifyProduct(Product product, ImageHolder thumbnail, List<ImageHolder> productImgHolderList) {
        //空值判断
        if (product != null && product.getShop() != null && product.getShop().getShopId() != null) {
            //给商品设置上属性
            product.setLastEditTime(new Date());
            //若商品缩略图不为空且原有缩略图不为空，则删除原有缩略图并添加
            if (thumbnail != null) {
                //先获取一遍原有信息，判断原来的信息里是否图片信息为空
                Product tempProduct = productMapper.queryProductById(product.getProductId());
                if (tempProduct.getImgAddr() != null) {
                    //删除原来图片
                    ImageUtil.deleteFileOrPath(tempProduct.getImgAddr());
                }
                //添加商品缩略图
                addThumbnail(product, thumbnail);
            }
            //如果有新存入的商品详情图，则将原有的全部删除，并添加新的图片
            if (productImgHolderList != null && productImgHolderList.size() > 0) {
                //将原有的全部删除
                deleteProductImgList(product.getProductId());
                //添加新的图片
                addProductImgList(product, productImgHolderList);
            }
            try {
                //更新商品信息
                int effectNum = productMapper.updateProduct(product);
                if (effectNum <= 0) {
                    throw new RuntimeException("更新商品信息失败");
                }
                return new ProductExecution(ProductStateEnum.SUCCESS, product);
            } catch (Exception e) {
                throw new RuntimeException("更新商品信息失败：" + e.toString());
            }
        } else {
            return new ProductExecution(ProductStateEnum.EMPTY);
        }
    }


    /**
     * 删除某个商品下的所有详情图
     *
     * @param productId
     */
    public void deleteProductImgList(int productId) {
        //根据productId获取原来的图片
        List<ProductImg> productImgList = productImgMapper.queryProductImgList(productId);
        //删除原来的图片
        for (ProductImg productImg : productImgList) {
            ImageUtil.deleteFileOrPath(productImg.getImgAddr());
        }
        //删除数据库中原有图片的信息
        productImgMapper.deleteProductImgByProductId(productId);
    }


    /**
     * 添加缩略图
     *
     * @param product
     * @param thumbnail
     */
    public void addThumbnail(Product product, ImageHolder thumbnail) {
        //获取基本路径
        String dest = PathUtil.getShopImagePath(product.getShop().getShopId());
        String thumbnailAddr = ImageUtil.generateThumbnail(thumbnail, dest);
        product.setImgAddr(thumbnailAddr);
    }

    /**
     * 批量添加图片
     *
     * @param product
     * @param
     */
    public void addProductImgList(Product product, List<ImageHolder> productImgHolderList) {
        //获取图片存储路径
        String dest = PathUtil.getShopImagePath(product.getShop().getShopId());
        List<ProductImg> productImgList = new ArrayList<ProductImg>();
        //遍历图片一次去处理，并添加进productImg实体类里
        for (ImageHolder productImgHolder : productImgHolderList) {
            String imeAddr = ImageUtil.generateNormalImg(productImgHolder, dest);
            ProductImg productImg = new ProductImg();
            productImg.setImgAddr(imeAddr);
            productImg.setProductId(product.getProductId());
            productImg.setCreateTime(new Date());
            productImg.setPriority(product.getPriority());
            productImgList.add(productImg);

        }
        //如果确实有图片需要添加，就执行批量添加操作
        if (productImgList.size() > 0) {
            try {
                int effectNum = productImgMapper.batchInsertProductImg(productImgList);
                if (effectNum <= 0) {
                    throw new RuntimeException("创建商品详情图片失败");
                }
            } catch (Exception e) {
                throw new RuntimeException("创建商品详情图片失败：" + e.toString());
            }
        }
    }
}
